Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

322
Views
¿Cómo usar RewriteRule de modo que $_SERVER['REQUEST_URI'] también se modifique para PHP?

Con este .htaccess :

 RewriteEngine On RewriteRule foo/(.*) /foo-$1 # here I tried [L], [PT], [C], etc. RewriteRule . index.php [L]

Probé todas las banderas posibles para la primera RewriteRule, pero siempre, este código PHP:

 <?php echo $_SERVER['REQUEST_URI']; ?>

siempre repite /foo/bar en lugar de /foo-bar , al acceder a http://example.com/foo/bar . ¿Por qué?

¿Cómo hacer que RewriteEngine de Apache también modifique REQUEST_URI que verá PHP?

Nota: no quiero [R] porque una redirección generaría una nueva solicitud del navegador y cambiaría la URL que se muestra en la barra de URL, lo cual no quiero.

Consulte también RewriteRule cuando la cadena de sustitución no es una ruta de archivo sino una URL que debe ser procesada por las siguientes reglas .

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Creo que lo que intentas hacer es imposible sin algún trabajo. He proporcionado 2 soluciones en esta publicación, una usando auto_prepend_file y otra usando mod_proxy.

Solución 1: usando auto_prepend_file

Mire el script a continuación, esto no establece directamente el REQUEST_URI global, sino que lo sobrescribe en PHP, con el siguiente código:

.htaccess

 php_value auto_prepend_file "before.php" RewriteEngine On RewriteRule foo/(.*) /foo-$1 RewriteRule . index.php [L]

Asegúrate de agregar esta línea:

 php_value auto_prepend_file "before.php"

antes.php

En este script, puede reemplazar REQUEST_URI:

Me gusta:

 $_SERVER['REQUEST_URI'] = "/" . str_replace('/', '-', ltrim($_SERVER['REQUEST_URI'], "/"));

Puede mejorar aún más este script, pero creo que el concepto es claro.

índice.php

Index.php no se ve afectado pero contiene la regla reescrita:

 var_dump($_SERVER['REQUEST_URI']); //string(7) "/foo-bar"

Una solicitud a http://localhost/foo/bar?test es ahora: string(13) "/foo-bar?test"

Actualizar

Al usar [L], puede obtener la URL reescrita de la siguiente manera:

 var_dump($_SERVER['REDIRECT_URL']); # /foo-bar

Entonces el .htaccess se convierte en:

 php_value auto_prepend_file "before.php" RewriteEngine On RewriteRule foo/(.*) /foo-$1 [L] # please note [L] here RewriteRule . index.php [L]

Por lo tanto, before.php puede ser reemplazado por:

 $_SERVER['REQUEST_URI'] = $_SERVER['REDIRECT_URL'];

Actualizar la solución 2; usando mod_proxy

Descubrí que también puedes usar mod proxy:

Tuve que habilitar los siguientes módulos:

 LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule proxy_ftp_module modules/mod_proxy_ftp.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so LoadModule proxy_connect_module modules/mod_proxy_connect.so

Ahora su .htaccess se cambia a (observe la bandera [P]):

 RewriteEngine On RewriteRule ^foo/(.+)$ /foo-$1 [L,P] RewriteRule . index.php

Esto enviará todas las solicitudes de foo/bar a /foo-bar y cambiará $_SERVER['REQUEST_URI'] consecuencia.

 var_dump($_SERVER['REQUEST_URI']); //output: string(8) "/foo-bar"

Sin embargo, creo que usar el archivo de prefijo de PHP es una forma más eficiente.

over 4 years ago · Santiago Trujillo Report

0

$_SERVER['REQUEST_URI'] devuelve el original-uri Apache y no current-uri .

Directiva CGIVar

Con este archivo .htaccess :

 CGIVar REQUEST_URI current-uri RewriteRule (.*) index.php [L]

entonces una solicitud a example.com/hello/world dará:

 $_SERVER["REQUEST_URI"] "/index.php" $_SERVER["REDIRECT_URL"] "/hello/world"

Sin la línea CGIVar , daría "/hello/world" tanto para REQUEST_URI como para REDIRECT_URL .

over 4 years ago · Santiago Trujillo Report

0

Después de más investigaciones, parece que PHP siempre verá la URL original en $_SERVER['REQUEST_URI'] y no el objetivo de RewriteRule. (fuente autorizada necesaria aquí).

Por cierto, el destino de una RewriteRule suele ser un archivo que procesará la solicitud, excepto si usamos un indicador de redirección [R], entonces en este caso el navegador realizará una nueva solicitud a la nueva URL (y la URL del navegador cambios de barra).

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!